#                  List(列表) | Tuple（元组）| Dict(字典) | Set(集合)
# 增加（Create）        √           ×            √            √
# 检索（Retrieve）      √           √            √            √
# 更新（Update）        √           ×            √            √
# 删除（Delete）        √           ×            √            √


# List(列表)
# Create
s = [1, 2, 3, 4, 5]
s2 = s + [6, 7]
print(s2)   # [1, 2, 3, 4, 5, 6, 7]

l = ['a'] * 10
print(l)

# 复制的是引用
x = 'a'
l = ['a'] * 3
print(id(x))
print(id(l[0]))    # 一致

a = '哈'
l = ['哈'] * 3
print(id(a))
print(id(l))    # 不一致，因为‘a’在python的常量池里，但列表复制一直是复制的引用

x = ['a']
l = [x] * 3
print(x)    # ['a']
print(l)    # [['a'], ['a'], ['a']]

x[0] = 'y'
print(l)    # [['y'], ['y'], ['y']]

l.append('a')   # 将元素插入到list的末尾
print(l)

l.insert(2, 'z')    # 指定位置插入元素
print(l)

# 检索（Retrieve）
print(l[0])

print(l[2:4])
print(l[:4])
print(l[2:])
print(l[-1])    # 取最后一个值

ss = list(range(100))
print(ss)
print(ss[10:50:5])  # 取10到50之间的值，间隔为5

s = ['a', 'b', 'c', 'd']
print(s)
print(s.index('c'))  # c的索引

print(s.insert(s.index('b'), 'z'))     # 在b的位置插入z, 返回None
print(s)    # ['a', 'z', 'b', 'c', 'd']

# 更新（Update）
s[2] = 's'  # 将s[2]处替换成s
print(s)    # ['a', 'z', 's', 'c', 'd']

s[1:3] = 'test'
print(s)    # ['a', 't', 'e', 's', 't', 'c', 'd']

print(s.pop())  # 删除末尾元素并返回

print(s.remove('t'))    # 删除元素不返回（返回None），只删除找到的第一个目标元素
print(s)

p = ['a', 'a', 'a', 's', 'w', 'g']
print(p.count('a'))  # 统计a在当前list中的个数

print(p.reverse())   # 在当前列表上做反向排序，返回None
print(p)    # ['g', 'w', 's', 'a', 'a', 'a']

print(list(reversed(p)))    # 返回新列表

l = [2, 4, 3, 6, 9, 7, 1]
l.sort()    # 在当前列表上做增序排序，返回None
print(l)    # [1, 2, 3, 4, 6, 7, 9]
l.sort(reverse=True)    # 反序排序, False是正序排序
print(l)    # [9, 7, 6, 4, 3, 2, 1]

l = [2, 4, 3, 6, 9, 7, 1]
print(list(sorted(l)))  # 返回新列表   [1, 2, 3, 4, 6, 7, 9]

# Tuple（元组）
# 检索（Retrieve）
t = (2, 5, 9)
print(t[1])  # 5

print(t[0:2])   # (2, 5)
print(t[0:8])   # (2, 5, 9)

print(t.index(9))  # 返回目标的索引   2

# Dict(字典)
# 增加（Create）
d = {"a":2}
d['b'] = 3
print(d)

d2 = {"c": 3, "d": 4}
d.update(d2)
print(d)    # {'a': 2, 'b': 3, 'c': 3, 'd': 4}

a = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
a.setdefault('z', 26)  # 添加参数
print(a)    # {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'z': 26}

a.setdefault('a', 26)   # 修改原有的参数，返回的是1
print(a)    # {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'z': 26}


# 检索（Retrieve）
print(a.get('w', -1))   # 如果字典中存在w这个键，就返回w的value；如果没有就返回默认值，这里设置为-1
print(a.get('b', -1))   # 如果字典中存在w这个键，就返回w的value
print(a)

print(a.keys())     # 返回所有key   dict_keys(['a', 'b', 'c', 'd', 'z'])

print(a.values())   # 返回所有值   dict_values([1, 2, 3, 4, 26])

print(a.items())    # 返回元组形式的键值对   dict_items([('a', 1), ('b', 2), ('c', 3), ('d', 4), ('z', 26)])

# 更新（Update）

a['a'] = 14	 # 将字典a中的a键value改为14
print(a)    # {'a': 14, 'b': 2, 'c': 3, 'd': 4, 'z': 26}

a.update({"w": 22, "a": 1})  # 将a键value的值改为1，并追加了一个键值对w
print(a)    # {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'z': 26, 'w': 22}

a.pop('a')	 # 删除a键，返回1
print(a)

a.popitem()     # 随机删除,尽量不要使用
print(a)

a.clear()  # 清空字典
print(a)    # {}

# Set(集合)

s = set()  # 创建一个set
s.add(1)    # 添加元素
s.add(2)
s.add(3)
print(s)    # {1, 2, 3}

print(1 in s)    # 判断当前元素在不在set里 True

a = {8, 4, 5, 7, 0}

a.update(s)     # 合并两个set，调用者改变
print(a)    # {0, 1, 2, 3, 4, 5, 7, 8}

b = {'d', 'w', 'q'}
a = {'x', 'e', 's'}
print(a.union(b))   # 返回一个合并后的set，原set不改变    {'q', 'd', 'x', 's', 'w', 'e'}
print(a)    # {'s', 'e', 'x'}
print(b)    # {'w', 'd', 'q'}

# print(a.remove('w'))   # 删除元素，不存在会报错
print(a.remove('e'))
print(a)    # {'x', 's'}

b.discard('e')  # 删除元素，不存在不会报错
print(b)    # {'w', 'q', 'd'}


b.pop()     # 随机删除一个元素
print(b)
